﻿namespace ECM7.NantContrib.Types
{
	using System;
	using System.Collections.Generic;
	using System.Globalization;
	using NAnt.Core;
	using NAnt.Core.Attributes;

	/// <summary>
	/// Коллекция правил конфигурации приложения
	/// </summary>
	[Serializable, ElementName("rules")]
	public class RulesCollection : DataTypeBase
	{
		/// <summary>
		/// Внутренняя коллекция правил
		/// </summary>
		private readonly Dictionary<string, string> rules = new Dictionary<string, string>();

		/// <summary>
		/// Заполнение внутренней коллекции правил значениями из конфигурационного файла
		/// </summary>
		[BuildElementArray("rule")]
		public RuleElement[] RulesElements
		{
			set
			{
				foreach (RuleElement el in value)
				{
					if (el.IfDefined && !el.UnlessDefined)
					{
						Rules.Add(el.XPath, el.Value);
					}
				}
			}
		}

		/// <summary>
		/// Трансформированная коллекция правил
		/// </summary>
		public Dictionary<string, string> Rules
		{
			get { return rules; }
		}

		#region Nested type: RuleElement

		/// <summary>
		/// Правило
		/// </summary>
		public class RuleElement : Element
		{
			/// <summary>
			/// Инициализация
			/// </summary>
			public RuleElement()
			{
				// ReSharper disable DoNotCallOverridableMethodsInConstructor
				IfDefined = true;

				// ReSharper restore DoNotCallOverridableMethodsInConstructor
			}

			/// <summary>
			/// Условие применения правила
			/// </summary>
			[TaskAttribute("if"), BooleanValidator]
			public virtual bool IfDefined { get; set; }

			/// <summary>
			/// XPath для выбора редактируемых элементов конфигурационного файла
			/// </summary>
			[StringValidator(AllowEmpty = false), TaskAttribute("xpath", Required = true)]
			public virtual string XPath { get; set; }

			/// <summary>
			/// Новое значение элементов
			/// </summary>
			[StringValidator(AllowEmpty = true), TaskAttribute("value", Required = true)]
			public virtual string Value { get; set; }

			/// <summary>
			/// Условия, при которых правило не исполдьзуется
			/// </summary>
			[BooleanValidator, TaskAttribute("unless")]
			public virtual bool UnlessDefined { get; set; }

			/// <summary>
			/// Строковое представление
			/// </summary>
			public override string ToString()
			{
				return string.Format("xpath: [{0}], value: [{1}]", XPath, Value);
			}
		}

		#endregion
	}
}
